# -*- coding: UTF-8 -*-
import time, math, datetime

def timesince(d, now=None):
    """
    Cette fonction accepte un objet datetime en argument et renvoie le
    temps qui s'est écoulé entre cette date et la date actuelle sous
    forme d'une chaîne correctement mise en forme, "10 minutes" par
    exemple.
    C'est une adaptation du code que vous trouverez à l'adresse
    http://blog.natbat.co.uk/archive/2003/Jun/14/time_since
    """
    original = time.mktime(d.timetuple())
    chunks = (
      (60 * 60 * 24 * 365, 'année'),
      (60 * 60 * 24 * 30, 'mois'),
      (60 * 60 * 24, 'jour'),
      (60 * 60, 'heure'),
      (60, 'minute')
    )
    if not now:
        now = time.time()
    since = now - original
    # On emploie ici une syntaxe de malade pour l'itération car on a besoin du i : c'est l'indice actuel
    for i, (seconds, name) in zip(range(len(chunks)), chunks):
        count = math.floor(since / seconds)
        if count != 0:
            break
    if count == 1:
        s = '1 %s' % name
    else:
        s = '%d %s%s' % (count, name, name != "mois" and 's' or '')
    if i + 1 < len(chunks):
        # On obtient maintenant le deuxième élément
        seconds2, name2 = chunks[i + 1]
        count2 = math.floor((since - (seconds * count)) / seconds2)
        if count2 != 0:
            if count2 == 1:
                s += ', 1 %s' % name2
            else:
                s += ', %d %s%s' % (count2, name2, name2 != "mois" and 's' or '')
    return s

def timeuntil(d):
    """
    Cette fonction est comme timesince mais renvoie une chaîne qui mesure
    le temps qui doit s'écouler pour qu'on parvienne à la date spécifiée.
    """
    now = datetime.datetime.now()
    return timesince(now, time.mktime(d.timetuple()))
